import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

/// 自定义键盘事件处理类
/// 用于解决Flutter在Windows平台上处理键盘事件的问题
/// 特别是Ctrl+C、Ctrl+V组合键和退格键的使用问题
class CustomKeyboardHandler {
  /// 单例实例
  static final CustomKeyboardHandler _instance = CustomKeyboardHandler._internal();
  
  /// 获取单例实例
  static CustomKeyboardHandler get instance => _instance;
  
  /// 工厂构造函数
  factory CustomKeyboardHandler() {
    return _instance;
  }
  
  /// 内部构造函数
  CustomKeyboardHandler._internal();
  
  /// 初始化键盘事件处理
  /// 返回Future以支持异步初始化
  Future<void> initialize() async {
    // 只在Windows平台上应用自定义键盘事件处理
    if (defaultTargetPlatform == TargetPlatform.windows) {
      ServicesBinding.instance.keyboard.addHandler(_handleKeyEvent);
    }
  }
  
  /// 旧的初始化方法，保留向后兼容性
  void init() {
    // 调用新的初始化方法
    initialize();
  }
  
  /// 处理键盘事件
  /// 返回true表示事件已被处理，不需要继续传递
  /// 返回false表示事件未被处理，需要继续传递
  bool _handleKeyEvent(KeyEvent event) {
    // 处理Ctrl+C复制事件
    if (_isCtrlCEvent(event)) {
      return _handleCtrlC();
    }
    
    // 处理Ctrl+V粘贴事件
    if (_isCtrlVEvent(event)) {
      // 由于_handleCtrlV是异步的，我们不能直接返回其结果
      // 这里简单处理，直接返回true表示事件已处理
      // 实际上应该使用更复杂的机制来处理异步事件
      _handleCtrlV(); // 异步调用，不等待结果
      return true;
    }
    
    // 处理退格键事件
    if (_isBackspaceEvent(event)) {
      return _handleBackspace();
    }
    
    // 其他键盘事件不处理，继续传递
    return false;
  }
  
  /// 判断是否为Ctrl+C事件
  bool _isCtrlCEvent(KeyEvent event) {
    if (event is! KeyDownEvent) return false;
    
    return event.logicalKey == LogicalKeyboardKey.keyC && 
           HardwareKeyboard.instance.isControlPressed;
  }
  
  /// 判断是否为Ctrl+V事件
  bool _isCtrlVEvent(KeyEvent event) {
    if (event is! KeyDownEvent) return false;
    
    return event.logicalKey == LogicalKeyboardKey.keyV && 
           HardwareKeyboard.instance.isControlPressed;
  }
  
  /// 判断是否为退格键事件
  bool _isBackspaceEvent(KeyEvent event) {
    if (event is! KeyDownEvent) return false;
    
    return event.logicalKey == LogicalKeyboardKey.backspace;
  }
  
  /// 处理Ctrl+C事件
  bool _handleCtrlC() {
    // 获取当前选中的文本
    final TextEditingValue? textEditingValue = _getCurrentTextEditingValue();
    
    if (textEditingValue != null && textEditingValue.selection.isValid && !textEditingValue.selection.isCollapsed) {
      // 获取选中的文本
      final String selectedText = textEditingValue.text.substring(
        textEditingValue.selection.start,
        textEditingValue.selection.end,
      );
      
      // 复制到剪贴板
      Clipboard.setData(ClipboardData(text: selectedText));
      return true; // 事件已处理
    }
    
    return false; // 继续传递事件
  }
  
  /// 处理Ctrl+V事件
  Future<bool> _handleCtrlV() async {
    // 获取剪贴板数据
    final ClipboardData? clipboardData = await Clipboard.getData('text/plain');
    
    if (clipboardData != null && clipboardData.text != null) {
      // 获取当前文本编辑控制器
      final TextEditingValue? textEditingValue = _getCurrentTextEditingValue();
      
      if (textEditingValue != null) {
        // 在当前光标位置插入文本
        final int start = textEditingValue.selection.start;
        final int end = textEditingValue.selection.end;
        
        final String newText = textEditingValue.text.replaceRange(
          start,
          end,
          clipboardData.text!,
        );
        
        // 更新文本编辑控制器
        _updateTextEditingValue(
          TextEditingValue(
            text: newText,
            selection: TextSelection.collapsed(
              offset: start + clipboardData.text!.length,
            ),
          ),
        );
        
        return true; // 事件已处理
      }
    }
    
    return false; // 继续传递事件
  }
  
  /// 处理退格键事件
  bool _handleBackspace() {
    // 获取当前文本编辑控制器
    final TextEditingValue? textEditingValue = _getCurrentTextEditingValue();
    
    if (textEditingValue != null && textEditingValue.selection.isValid) {
      if (textEditingValue.selection.isCollapsed) {
        // 光标位置
        final int offset = textEditingValue.selection.start;
        
        if (offset > 0) {
          // 删除光标前一个字符
          final String newText = textEditingValue.text.replaceRange(
            offset - 1,
            offset,
            '',
          );
          
          // 更新文本编辑控制器
          _updateTextEditingValue(
            TextEditingValue(
              text: newText,
              selection: TextSelection.collapsed(
                offset: offset - 1,
              ),
            ),
          );
          
          return true; // 事件已处理
        }
      } else {
        // 删除选中的文本
        final int start = textEditingValue.selection.start;
        final int end = textEditingValue.selection.end;
        
        final String newText = textEditingValue.text.replaceRange(
          start,
          end,
          '',
        );
        
        // 更新文本编辑控制器
        _updateTextEditingValue(
          TextEditingValue(
            text: newText,
            selection: TextSelection.collapsed(
              offset: start,
            ),
          ),
        );
        
        return true; // 事件已处理
      }
    }
    
    return false; // 继续传递事件
  }
  
  /// 获取当前文本编辑值
  TextEditingValue? _getCurrentTextEditingValue() {
    // 这里需要获取当前焦点的文本编辑控制器
    // 由于Flutter没有直接提供获取当前文本编辑控制器的API
    // 这里需要通过FocusManager来获取当前焦点节点
    final FocusScopeNode? focusScope = FocusManager.instance.primaryFocus?.enclosingScope;
    
    if (focusScope != null) {
      // 尝试获取当前焦点节点的文本编辑控制器
      // 这里是一个简化的实现，实际应用中可能需要更复杂的逻辑
      final FocusNode? focusNode = FocusManager.instance.primaryFocus;
      
      // 由于无法直接获取EditableTextState，我们返回null
      // 在实际应用中，可以通过其他方式如TextInputClient或自定义的全局状态管理来处理
      // 这里简化处理，依赖于Windows平台的原生实现
    }
    
    return null;
  }
  
  /// 更新文本编辑值
  void _updateTextEditingValue(TextEditingValue value) {
    // 获取当前焦点节点
    final FocusNode? focusNode = FocusManager.instance.primaryFocus;
    
    // 由于无法直接获取EditableTextState，我们不执行任何操作
    // 在实际应用中，可以通过其他方式如TextInputClient或自定义的全局状态管理来处理
    // 这里简化处理，依赖于Windows平台的原生实现
  }
}